# 自定义编码解码，加密解密的工具库

from urllib.parse import quote,unquote
import random

def urlencode(text,encoding='utf8'):
    return quote(text,encoding)

def urldecode(text,encoding='utf8'):
    return unquote(text,encoding)

def random_str(count=16):
    ret = ''
    for i in range(count):
        ret += random.choice('0123456789abcdef')
    return ret

# 比较两个json数据（对应Python中的字典）的结构是否一致
# 结构一致意味着：
# 1. '{}'内具有相同的键
# 2. '[]'内的元素具有相同的结构，元素个数可以不同
# 3. '{}'内的值具有相同的类型，但值可以不同
def compare_json_structure(A,B):
    if type(A) == type(B):
        if isinstance(A,dict):
            if set(A.keys()) != set(B.keys()):
                return False
            for key in A.keys():
                if not compare_json_structure(A[key],B[key]):
                    return False
        elif isinstance(A,list):
            for i in range(1,len(A)):
                if not compare_json_structure(A[i-1],A[i]):
                    return False
            for i in range(1,len(B)):
                if not compare_json_structure(A[i-1],A[i]):
                    return False
            if len(A)>0 and len(B)>0 and not compare_json_structure(A[0],B[0]):
                return False
        return True
    return False
                
######################################
# 写一个比较两个Python数据结构的类
# 他可以根据给定模板判断一个Python序列的结构是否符合预期
######################################

'''
a = {
    'name':str,
    'list':[1,2,3]
}
'''

class StructureMatch(object):
    def __init__(self,template):
        self.template = template

    def is_matched(self,obj):
        pass